package projeto.controller;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.sql.*;

import projeto.model.LeituraDeDados;
import projeto.model.Usuario;

/**
 *Esta Classe é responsável por fazer a comunicação com o banco de dados, puxar o arquivo de opiniões de lá e construir o arquivo localmente
 *possibilitando assim, consultas online. Também é possível salvar sua opinião no banco de dados, para futuras consultas. 
 * @author Walter Alves
 *
 */

public class ControleBancoDeDados {
        private static final int DETESTO = -5,MUITO_RUIM = -4,BASTANTE_RUIM = -3,RUIM = -2,POUCO_RUIM = -1,
					  NAO_CONHECO = 0,NA0_RUIM = 1,BONZINHO = 2,BASTANTE_BOM = 3,MUITO_BOM = 4,INCRIVEL = 5;
	private static String driver = "com.mysql.jdbc.Driver";  
	private static String URL = "jdbc:mysql://mysql10.kinghost.net/";
	private static String DB = "bandaafrodite03";
	private static String username = "bandaafrodite03";
	private static String senha = "walter123";
	private static Connection con;
	
	/**
	 * Este método é responsável por fazer a verificação de conexão com o banco de dados, implicitamente, ele também faz a conexão com o banco de dados;
	 * @return online - retorna true caso a conexão esteja OK, ou false caso tenha problemas ao se conectar;
	 */
	
	public static boolean verificaConexao(){
		 try {
			Class.forName(driver).newInstance();
			con = DriverManager.getConnection(URL+DB, username, senha);
			return con != null;
		} catch (InstantiationException e) {
			e.printStackTrace();
			return false;
		} catch (IllegalAccessException e) {
			e.printStackTrace();
			return false;
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			return false;
		} catch (SQLException e) {
			e.printStackTrace();
			return false;
		}
		
	}
	/**
	 * Este método é responsável por salvar um usuário online no banco de dados;
	 * @param user - Usuario que será salvo no banco de dados;
	 * @return salvou - retorna True se for salvo com sucesso ou false se não for possível salvar o usuário;
	 */
	public static boolean adicionaOpiniao(Usuario user){
		Statement stm;
		try{
                        if(verificaConexao()){
                            stm = con.createStatement();
                            String formatacaoOpinioes = "";
		for(int opiniao : user.getOpnioes()){
			switch(opiniao){
				case DETESTO:
					formatacaoOpinioes += ";-5 : Detesto";
					break;
				case MUITO_RUIM:
					formatacaoOpinioes += ";-4 : Acho muito ruim";
					break;
				case BASTANTE_RUIM:
					formatacaoOpinioes += ";-3 : Bastante ruim";
					break;
				case RUIM:
					formatacaoOpinioes += ";-2 : Bastante ruim";
					break;
				case POUCO_RUIM:
					formatacaoOpinioes += ";-1 : Acho um pouco ruim";
					break;
				case NAO_CONHECO:
					formatacaoOpinioes += ";0 : Não conheço";
					break;
				case NA0_RUIM:
					formatacaoOpinioes += ";1 : Não é ruim";
					break;
				case BONZINHO:
					formatacaoOpinioes += ";2 : É bonzinho";
					break;
				case BASTANTE_BOM:
					formatacaoOpinioes += ";3 : Bastante bom";
					break;
				case MUITO_BOM:
					formatacaoOpinioes += ";4 : Muito bom";
				case INCRIVEL:
					formatacaoOpinioes += ";5 : Incrível, sensacional, impressionante";
				default:
					break;
					
			}
		}
		String saida = user.getData()+ ";" + user.getNome()+formatacaoOpinioes;
                            return stm.executeUpdate("INSERT INTO projeto_lp2_usuarios(dados_usuario) VALUES('"+saida+"')") > 0;
                        }else{
                            return false;
                        }
		}catch(Exception e ){
			e.printStackTrace();
			return false;
		}
	}
	/**
	 * Este método gera um arquivo de usuários temporario, no qual será usado pelo sistema para suas devidas operações;
	 * @return gerou - retorna true se o arquivo foi gerado com sucesso, e retorna false se o arquivo não foi gerado;
	 */
	public static boolean geraArquivoUsuariosLocal(){
		PrintWriter outputStream = null;
		Statement stm;
		if(verificaConexao()){
			try{
				stm = con.createStatement();
				ResultSet requisicao = stm.executeQuery("SELECT * FROM projeto_lp2_usuarios");
				while(requisicao.next()){
					outputStream = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream("tempLocalFileUsuarios.data",true),"UTF-8")));
					String conteudo = requisicao.getString("dados_usuario");
					outputStream.append(conteudo+System.getProperty("line.separator"));
					outputStream.close();
				}
				return true;
			}catch(Exception e){
				return false;
			}
		}else{
			return false;
		}
	}
        /**
	 * Este método gera um arquivo de estabelecimentos temporario, no qual será usado pelo sistema para suas devidas operações;
	 * @return gerou - retorna true se o arquivo foi gerado com sucesso, e retorna false se o arquivo não foi gerado;
	 */
        public static boolean geraArquivoEstabelecimentosLocal(){
            PrintWriter outputStream = null;
		Statement stm;
		if(verificaConexao()){
			try{
				stm = con.createStatement();
				ResultSet requisicao = stm.executeQuery("SELECT * FROM projeto_lp2_estabelecimentos");
				while(requisicao.next()){
					outputStream = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream("tempLocalFileEstabelecimentos.data",true),"UTF-8")));
					String conteudo = requisicao.getString("dados_estabelecimento");
					outputStream.append(conteudo+System.getProperty("line.separator"));
					outputStream.close();
				}
				return true;
			}catch(Exception e){
				return false;
			}
		}else{
			return false;
		}
        }
        
        public static void apagaArquivosTemporarios(){
            File arq = new File("tempLocalFileEstabelecimentos.data");
            arq.delete();
            arq = new File("tempLocalFileUsuarios.data");
            arq.delete();
        }
	
}
